import java.util.ArrayList;
import java.util.List;

/**
 * College 类：实现聚合（Building）和组合（Course）两种关系。
 */
public class College {
    
    // --- 聚合 (Aggregation) 实现: College 包含 Building ---
    // Building 列表。注意：Building 可以在 College 外部创建。
    private List<Building> buildings; 

    // --- 组合 (Composition) 实现: College 包含 Course ---
    // Course 列表。注意：Course 应该在 College 内部创建或管理，
    // 且当 College 对象被销毁时，Course 对象逻辑上也应被销毁。
    private List<Course> courses; 

    public College() {
        this.buildings = new ArrayList<>();
        // 组合关系：部分与整体生命周期一致，通常在此处初始化内部集合
        this.courses = new ArrayList<>(); 
    }

    // 聚合关系方法：可以从外部添加 Building
    public void addBuilding(Building building) {
        this.buildings.add(building);
    }
    
    // 组合关系方法：通常在 College 内部创建或管理 Course
    public Course addCourse(String title, Building location) {
        // 创建 Course 实例，同时满足其在 Building 中的约束
        Course newCourse = new Course(title, location); 
        this.courses.add(newCourse);
        return newCourse;
    }

    // 模拟 College 销毁
    public void dismantle() {
        System.out.println("\n--- 模拟 College 销毁 ---");
        
        // 1. 聚合 (Building): College 销毁后，Building 仍然存在
        System.out.println("聚合：College 销毁，但 Building (" + this.buildings.get(0).getName() + ") 仍然存在于内存中。");
        this.buildings = null; // 失去引用，但对象本身可能还在

        // 2. 组合 (Course): College 销毁，Course 也应该被销毁 (GC回收)
        System.out.println("组合：College 销毁，Course (" + this.courses.get(0).getTitle() + ") 应该随之消失/销毁。");
        this.courses = null; // 强制释放内部对象引用，模拟生命周期依赖
    }
    
    // --- 主测试方法 ---
    public static void main(String[] args) {
        // 1. 创建独立存在的 Building (用于聚合和约束)
        Building library = new Building("Library");

        // 2. 创建 College 整体
        College mainCollege = new College();
        
        // --- 实现聚合关系：Building 加入 College ---
        mainCollege.addBuilding(library);
        
        // --- 实现组合关系：Course 在 College 内创建，并满足约束 ---
        Course math101 = mainCollege.addCourse("Math 101", library);
        
        // 3. 运行信息输出
        System.out.println("College 建立完成。");
        System.out.println("Building 列表: " + mainCollege.buildings.get(0).getName());
        System.out.println("Course 列表: " + math101.getTitle());
        System.out.println("约束检查: " + math101.getTitle() + " 安排在 " + math101.getLocationName());
        
        // 4. 模拟销毁，体现聚合与组合的区别
        mainCollege.dismantle();
    }
}